package pe.gob.mininter.dirandro.vaadin.panel.util;

import java.util.List;

import org.apache.log4j.Logger;

import pe.gob.mininter.dirandro.model.Dependencia;
import pe.gob.mininter.dirandro.model.Entidad;
import pe.gob.mininter.dirandro.model.Valor;
import pe.gob.mininter.dirandro.service.EntidadService;
import pe.gob.mininter.dirandro.service.ValorService;
import pe.gob.mininter.dirandro.util.Constante;
import pe.gob.mininter.dirandro.vaadin.util.Injector;

import com.vaadin.annotations.AutoGenerated;
import com.vaadin.data.Property.ValueChangeEvent;
import com.vaadin.data.Property.ValueChangeListener;
import com.vaadin.data.util.BeanItemContainer;
import com.vaadin.ui.Alignment;
import com.vaadin.ui.Button;
import com.vaadin.ui.Button.ClickEvent;
import com.vaadin.ui.Button.ClickListener;
import com.vaadin.ui.ComboBox;
import com.vaadin.ui.CustomComponent;
import com.vaadin.ui.HorizontalLayout;
import com.vaadin.ui.Label;
import com.vaadin.ui.Window;

/**
 * Componente para seleccionar Tipo de entidad 
 * @author ecampos
 *
 */
public class PanelSeleccionarEntidad extends CustomComponent {

	/*- VaadinEditorProperties={"grid":"RegularGrid,20","showGrid":true,"snapToGrid":true,"snapToObject":true,"movingGuides":false,"snappingDistance":10} */

	//TODO reemplazar en egistro de parte principal y de documentos
	
	@AutoGenerated
	private HorizontalLayout mainLayout;
	@AutoGenerated
	private HorizontalLayout lytDependencia;
	@AutoGenerated
	private Button btnSeleccionar;
	@AutoGenerated
	private Label lblDependencia;
	@AutoGenerated
	private HorizontalLayout lytEntidad;
	@AutoGenerated
	private ComboBox cmbSubTipo;
	@AutoGenerated
	private ComboBox cmbTipo;
	@AutoGenerated
	private ComboBox cmbProcedencia;
	/**
	 * 
	 */
	private static final long serialVersionUID = -7526541107112328133L;
	/**
	 * The constructor should first build the main layout, set the
	 * composition root and then do any custom initialization.
	 *
	 * The constructor will not be automatically regenerated by the
	 * visual editor.
	 */
	
	private static final Logger logger = Logger.getLogger(PanelSeleccionarEntidad.class);
	private ValorService valorService;
	private EntidadService entidadService;
	private List<Valor> lstProcendencias;
	private List<Valor> lstTipoEntidades;
	private List<Entidad> lstEntidades;
	private DependenciaComponent panelDependencia;
	private Dependencia dependencia; 
	
	public Dependencia getDependencia() {
		return dependencia;
	}

	public void setDependencia(Dependencia dependencia) {
		this.dependencia = dependencia;
		lblDependencia.setValue( dependencia.getNombre() );
	}

	public Valor getProcedencia(){
		return (Valor)cmbProcedencia.getValue();
	}
	
	/**
	 * devuelve el ID de la entidad o dependencia seleccionada
	 * @return
	 */
	public Long getIdentificador(){
		if(lytDependencia.isVisible()){
			return getDependencia().getId();
		}else{
			if(cmbTipo.getValue()!=null)
				return ((Valor)cmbTipo.getValue()).getId();
		}
		return null;
	}
	
	public PanelSeleccionarEntidad() {
		buildMainLayout();
		setCompositionRoot(mainLayout);
		entidadService = Injector.obtenerServicio(EntidadService.class);
		valorService = Injector.obtenerServicio(ValorService.class);
		postConstruct();
	}

	private void postConstruct(){
		limpiar();
		cmbProcedencia.setInputPrompt("Procedencia");
		cmbTipo.setInputPrompt("Tipo");
		cmbSubTipo.setInputPrompt("Sub Tipo");
	
		cargarProcedencia();
		
		btnSeleccionar.addListener(new ClickListener() {
			
			private static final long serialVersionUID = 4539783663387871432L;

			@Override
			public void buttonClick(ClickEvent event) {
				
				cargaPanelDependencia();
				
			}
			
		});
	}
	
	private void cargaPanelDependencia(){
		obtenerDependencia();
	}
	
	public void obtenerDependencia(){
		
		panelDependencia = new DependenciaComponent();
		
		if(this.getParent().getParent()!=null){
			panelDependencia.setParent(this.getParent().getParent());
		}else{
			panelDependencia.setParent(this.getParent());
		}
		Window window=new Window(){
			
			private static final long serialVersionUID = 1L;

			@Override
			protected void close() {
				 getApplication().getMainWindow().removeWindow(getWindow());
			}

			@Override
			public void detach() {
				if(panelDependencia.getDependencia()!=null)
					setDependencia(panelDependencia.getDependencia());
			}
			  
		};
		window.setCaption("Seleccionar Dependencia");
		window.addComponent(panelDependencia);
		window.setModal(true);
		window.setResizable(false);
		window.setWidth("620px");
		window.setHeight("-1px");
		getApplication().getMainWindow().addWindow(window);
		
	
	}
	
	
	private void cargarProcedencia(){
		logger.debug("carga procedecia");
		lstProcendencias = valorService.obtenerLista(Constante.LISTA.CODIGO.TABLAS);
		cmbProcedencia.setImmediate(true);
		cmbProcedencia.setContainerDataSource(new BeanItemContainer<Valor>(Valor.class,  lstProcendencias));
		cmbProcedencia.setItemCaptionPropertyId("descripcion");
		cmbProcedencia.addListener(new ValueChangeListener() {
			
			private static final long serialVersionUID = 6876725531841960773L;
			@Override
			public void valueChange(ValueChangeEvent event) {
				valueChangeProcedencia();
			}
		});
	}
	
	private void valueChangeProcedencia(){
		cmbTipo.removeAllItems();
		cmbSubTipo.removeAllItems();
		if(cmbProcedencia.getValue()!=null){
			if (((Valor) cmbProcedencia.getValue()).getCodigo().equals(Constante.VALOR.CODIGO.ENTIDAD)) {
				lytEntidad.setVisible(true);
				lytDependencia.setVisible(false);
				cargaComboTipo( );
			}else if (((Valor) cmbProcedencia.getValue()).getCodigo().equals(Constante.VALOR.CODIGO.DEPENDENCIA)) {
				lytEntidad.setVisible(false);
				lytDependencia.setVisible(true);
			}	
		}
	}
	
	private void cargaComboTipo( ){
		logger.debug("cargaComboTipo");
		if (cmbProcedencia.getValue() != null) {
			lstTipoEntidades = valorService.obtenerLista(Constante.LISTA.CODIGO.ENTIDAD_TIPO);
			cmbTipo.setContainerDataSource(new BeanItemContainer<Valor>(Valor.class,  lstTipoEntidades));
			cmbTipo.setInputPrompt("Tipo de Entidad");
			cmbTipo.setImmediate(true);
			cmbTipo.setItemCaptionPropertyId("nombre");
			cmbTipo.addListener( new ValueChangeListener() {
				
				private static final long serialVersionUID = -4721770533858762047L;

				@Override
				public void valueChange(ValueChangeEvent event) {
					cmbSubTipo.removeAllItems();
					cargarEntidadesChange( );
				}
			});
		}	
	}
	
	private void cargarEntidadesChange( ){
		logger.debug("cargarEntidadesChange");
		Entidad entidad = new Entidad();
		entidad.setTipo((Valor)cmbTipo.getValue());
		lstEntidades = entidadService.buscar(entidad);
		cmbSubTipo.setContainerDataSource(new BeanItemContainer<Entidad>(Entidad.class, lstEntidades));
		cmbSubTipo.setItemCaptionPropertyId("nombre");
	}
	
	/**
	 * permite cargar los combos segun los datos proporcionados
	 */
	public void cargarDatos(){
		//TODO implementar para el editar datos
	}
	
	/**
	 * metodo para limpiar los combos y label 
	 */
	public void limpiar(){
		if(cmbProcedencia.isEnabled()){
			cmbProcedencia.select(null);

			lytDependencia.setVisible(false);
			lytEntidad.setVisible(false);

		}
			
		cmbSubTipo.select(null);
		cmbTipo.select(null);
		lblDependencia.setValue("--SELECCIONAR--");
		
	}
	/**
	 * para mostrar solo entidades 
	 */
	public void soloEntidades(){
		Valor v = valorService.obtenerValor(Constante.LISTA.CODIGO.TABLAS,Constante.VALOR.CODIGO.ENTIDAD);
		logger.debug( "mostrar solo entiades " + v.getCodigo() );
		cmbProcedencia.select(v);
		valueChangeProcedencia();
		cmbProcedencia.setEnabled(false);
	}
	
	@AutoGenerated
	private HorizontalLayout buildMainLayout() {
		// common part: create layout
		mainLayout = new HorizontalLayout();
		mainLayout.setImmediate(false);
		mainLayout.setWidth("-1px");
		mainLayout.setHeight("-1px");
		mainLayout.setMargin(false);
		
		// top-level component properties
		setWidth("-1px");
		setHeight("-1px");
		
		// cmbProcedencia
		cmbProcedencia = new ComboBox();
		cmbProcedencia.setCaption("Procedencia");
		cmbProcedencia.setImmediate(false);
		cmbProcedencia
				.setDescription("Indica el tipo de entidad de procedencia");
		cmbProcedencia.setWidth("-1px");
		cmbProcedencia.setHeight("-1px");
		mainLayout.addComponent(cmbProcedencia);
		
		// lytEntidad
		lytEntidad = buildLytEntidad();
		mainLayout.addComponent(lytEntidad);
		
		// lytDependencia
		lytDependencia = buildLytDependencia();
		mainLayout.addComponent(lytDependencia);
		mainLayout.setComponentAlignment(lytDependencia, new Alignment(33));
		
		return mainLayout;
	}

	@AutoGenerated
	private HorizontalLayout buildLytEntidad() {
		// common part: create layout
		lytEntidad = new HorizontalLayout();
		lytEntidad.setImmediate(false);
		lytEntidad.setWidth("-1px");
		lytEntidad.setHeight("-1px");
		lytEntidad.setMargin(false);
		
		// cmbTipo
		cmbTipo = new ComboBox();
		cmbTipo.setCaption("Tipo");
		cmbTipo.setImmediate(false);
		cmbTipo.setDescription("Tipo de Entidad");
		cmbTipo.setWidth("-1px");
		cmbTipo.setHeight("-1px");
		lytEntidad.addComponent(cmbTipo);
		
		// cmbSubTipo
		cmbSubTipo = new ComboBox();
		cmbSubTipo.setCaption("Entidad");
		cmbSubTipo.setImmediate(false);
		cmbSubTipo.setDescription("Entidadd");
		cmbSubTipo.setWidth("-1px");
		cmbSubTipo.setHeight("-1px");
		lytEntidad.addComponent(cmbSubTipo);
		
		return lytEntidad;
	}

	@AutoGenerated
	private HorizontalLayout buildLytDependencia() {
		// common part: create layout
		lytDependencia = new HorizontalLayout();
		lytDependencia.setImmediate(false);
		lytDependencia.setWidth("-1px");
		lytDependencia.setHeight("-1px");
		lytDependencia.setMargin(false);
		
		// lblDependencia
		lblDependencia = new Label();
		lblDependencia.setImmediate(false);
		lblDependencia.setWidth("250px");
		lblDependencia.setHeight("25px");
		lblDependencia.setValue("--SELECCIONAR--");
		lytDependencia.addComponent(lblDependencia);
		
		// btnSeleccionar
		btnSeleccionar = new Button();
		btnSeleccionar.setCaption("Seleccionar");
		btnSeleccionar.setImmediate(true);
		btnSeleccionar.setWidth("-1px");
		btnSeleccionar.setHeight("-1px");
		lytDependencia.addComponent(btnSeleccionar);
		
		return lytDependencia;
	}

}
